openapi: 3.0.1
info:
  title: Parallax Api
  description: >-
    The Parallax API allows developers to integrate with core platform data
    related to clients, projects, and opportunities. It is primarily designed to
    support CRM integrations, enabling systems to push and pull data in and out
    of Parallax for better visibility and coordination.The API uses standard
    REST principles, with JSON responses and token-based authentication. It is
    versioned and designed to expand over time.A timesheet API is planned for
    future versions, which will support time entry, reporting, and resource
    planning features.
  license:
    name: Proprietary
    url: https://www.getparallax.com/terms-of-use
  version: v1
servers:
  - url: https://api.getparallax.com
    description: Production Server
paths:
  /v1/actual-time:
    get:
      tags:
        - ActualTime
      summary: List Actual Time
      description: >-
        Gets a paginated list of actual time entries with optional filtering by
        date range, project offering, and person. When no start or end date
        filters are provided, returns entries from the last 7 days (7 days ago
        through today).
      operationId: ListActualTime
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: start_date
          in: query
          description: >-
            Filter by entries recorded on or after this date. When not provided,
            defaults to 7 days ago from today. ISO date formatting expected
            (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Filter by entries recorded on or after this date. When not
              provided, defaults to 7 days ago from today. ISO date formatting
              expected (yyyy-MM-dd)
            format: date
        - name: end_date
          in: query
          description: >-
            Filter by entries recorded on or before this date. When not
            provided, defaults to today. ISO date formatting expected
            (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Filter by entries recorded on or before this date. When not
              provided, defaults to today. ISO date formatting expected
              (yyyy-MM-dd)
            format: date
        - name: project_offering_id
          in: query
          description: >-
            The id of the project offering in which the actual time entry
            belongs to.
          schema:
            type: string
            description: >-
              The id of the project offering in which the actual time entry
              belongs to.
            format: uuid
        - name: person_id
          in: query
          description: >-
            The id of the Person to which the actual time entry belongs. If a
            person is specified who does not currently have a role on the
            project, a new `ProjectOfferingRole` will be created using the
            person's default organization role. The person will be assigned to
            it, and the ActualTime entry will be attached.
          schema:
            type: string
            description: >-
              The id of the Person to which the actual time entry belongs. If a
              person is specified who does not currently have a role on the
              project, a new `ProjectOfferingRole` will be created using the
              person's default organization role. The person will be assigned to
              it, and the ActualTime entry will be attached.
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActualTimeDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - ActualTime
      summary: Create Actual Time
      description: >-
        Creates a new record representing hours a person has logged to a
        project, typically synced from the Timesheet System for tracking actuals
        against planned work. Parallax only allows a person to have a single
        role on a project offering, which means that the role is inferred by
        `project_offering_id`.
      operationId: CreateActualTime
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateActualTime'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateActualTime'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActualTime'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/actual-time/{id}:
    delete:
      tags:
        - ActualTime
      summary: Delete Actual Time
      description: >-
        Removes a recorded entry of hours worked from the system, typically used
        for error correction or cleanup.
      operationId: DeleteActualTime
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '204':
          description: No Content
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    get:
      tags:
        - ActualTime
      summary: Get Actual Time
      description: Fetches specified actual time details by id.
      operationId: GetActualTime
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActualTime'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - ActualTime
      summary: Update Actual Time
      description: >-
        Updates an existing Actual Hours record, used to correct or adjust time
        entries for accuracy in utilization and variance tracking.
      operationId: UpdateActualTime
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateActualTime'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateActualTime'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/clients:
    get:
      tags:
        - Clients
      summary: List Clients
      description: >-
        Gets a paginated list of client organizations tracked in the system,
        supporting filtering and searching for project association and
        reporting.
      operationId: ListClients
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - Clients
      summary: Create Client
      description: >-
        Creates a new client representing an organization that projects and
        revenue are associated with.
      operationId: CreateClient
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateClient'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateClient'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/clients/{id}:
    get:
      tags:
        - Clients
      summary: Get Client
      description: >-
        Gets a specific client details by id, useful for project association and
        sales pipeline reporting.
      operationId: GetClient
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - Clients
      summary: Update Client
      description: >-
        Modifies an existing client, updating details like name, account
        manager, or CRM identifiers.
      operationId: UpdateClient
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateClient'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateClient'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/departments:
    get:
      tags:
        - Departments
      summary: List Departments
      description: >-
        Returns a paginated list of departments configured in the system, used
        to categorize people and roles for filtering and resourcing.
      operationId: ListDepartments
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DepartmentDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - Departments
      summary: Create Department
      description: Creates a new Department to categorize roles within the organization.
      operationId: CreateDepartment
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateDepartment'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateDepartment'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Department'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/departments/{id}:
    patch:
      tags:
        - Departments
      summary: Update Department
      description: Updates an existing department's name or archived status.
      operationId: UpdateDepartment
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateDepartment'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateDepartment'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/people:
    get:
      tags:
        - People
      summary: List People
      description: Returns a paginated list of individuals in the system.
      operationId: ListPeople
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - People
      summary: Create Person
      description: >-
        Creates a profile for an individual within the organization, defining
        capacity, roles, and billable status for resourcing and forecasting.
      operationId: CreatePerson
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreatePerson'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreatePerson'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Person'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/people/{id}:
    get:
      tags:
        - People
      summary: Get Person
      description: Fetches specified person's profile details by id.
      operationId: GetPerson
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Person'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - People
      summary: Update Person
      description: >-
        Updates a person’s profile details such as capacity, cost rate, billing
        type, or termination date.
      operationId: UpdatePerson
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdatePerson'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdatePerson'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/pipelines:
    get:
      tags:
        - Pipelines
      summary: List Pipelines
      description: Fetches a paginated list of sales pipelines
      operationId: ListPipelines
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PipelineDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - Pipelines
      summary: Create Pipeline
      description: >-
        Creates a new pipeline in the system to create pipeline stages for,
        unlocking the ability to track a deal's progress through the sale cycle.
      operationId: CreatePipeline
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreatePipeline'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreatePipeline'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pipeline'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/pipelines/{id}:
    get:
      tags:
        - Pipelines
      summary: Get Pipeline by id
      description: >-
        Fetches pipeline by id to support sales forecasting and resource
        planning.
      operationId: GetPipeline
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pipeline'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - Pipelines
      summary: Update Pipeline
      description: >-
        Updates an existing pipeline entry to reflect stage changes, budget
        adjustments, or anticipated start dates.
      operationId: UpdatePipeline
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdatePipeline'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdatePipeline'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/pipelines/{pipeline_id}/stages:
    get:
      tags:
        - Stages
      summary: List Pipeline Stages
      description: >-
        Gets all pipeline stages reflected in the specified sales pipeline,
        enabling alignment between sales forecasting and project readiness.
      operationId: ListStages
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
        - name: pipeline_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StageDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - Stages
      summary: Create Pipeline Stage
      description: >-
        Adds a new sales stage to the specified pipeline mapping in Parallax,
        aligning sales progress with resourcing needs.
      operationId: CreateStage
      parameters:
        - name: pipeline_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateStage'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateStage'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stage'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/pipelines/{pipeline_id}/stages/{id}:
    get:
      tags:
        - Stages
      summary: Get Pipeline Stage
      description: Gets details of a pipeline stage used in sales pipeline alignment.
      operationId: GetStage
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: pipeline_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stage'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - Stages
      summary: Update Pipeline Stage
      description: >-
        Updates a stage in the pipeline used to mirror opportunity progress into
        Parallax.
      operationId: UpdateStage
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: pipeline_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateStage'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateStage'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects:
    get:
      tags:
        - Projects
      summary: List Projects
      description: >-
        Gets a paginated list of projects in the system, including client and
        internal projects, for comprehensive visibility across your portfolio.
      operationId: ListProjects
      parameters:
        - name: external_id
          in: query
          description: >-
            Filter by external integration ID in the format 'provider:id' (e.g.,
            'externalapp:12345').  If the integration is managed by Parallax,
            the format of 'px_provider:id' is expected (e.g.,
            'px_hubspot:12345')
          schema:
            type: string
            description: >-
              Filter by external integration ID in the format 'provider:id'
              (e.g., 'externalapp:12345').  If the integration is managed by
              Parallax, the format of 'px_provider:id' is expected (e.g.,
              'px_hubspot:12345')
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - Projects
      summary: Create Project
      description: >-
        Creates a new Project entity, either via CRM integration or manually for
        internal use, serving as the main container for Service Offerings.
      operationId: CreateProject
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateProject'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateProject'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{id}:
    get:
      tags:
        - Projects
      summary: Get Project
      description: >-
        Gets a specific project's full details, including Service Offerings,
        status, and key performance indicators.
      operationId: GetProject
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - Projects
      summary: Update Project
      description: >-
        Updates project-level details such as name, status, client association,
        and overall metadata.
      operationId: UpdateProject
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateProject'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateProject'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{project_id}/offerings:
    get:
      tags:
        - ProjectOfferings
      summary: List Project Offerings
      description: >-
        Gets a paginated list of Project Offerings for a specified project,
        which serve as containers for resource plans, budgets, and financial
        models.
      operationId: ListProjectOfferings
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: terms
          in: query
          schema:
            type: string
        - name: project_id
          in: path
          description: The ID of the Project, to which this Project Offering belongs.
          required: true
          schema:
            type: string
            description: The ID of the Project, to which this Project Offering belongs.
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectOfferingDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - ProjectOfferings
      summary: Create Project Offering.
      description: >-
        Creates a new Project Offering for the specified Project. Additional
        configuration for certain Billing Models are optional.
      operationId: CreateProjectOffering
      parameters:
        - name: project_id
          in: path
          description: The ID of the Project, to which this Project Offering belongs.
          required: true
          schema:
            type: string
            description: The ID of the Project, to which this Project Offering belongs.
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateProjectOffering'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateProjectOffering'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectOffering'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{project_id}/offerings/{id}:
    get:
      tags:
        - ProjectOfferings
      summary: Get Project Offering
      description: >-
        Gets details of a specific Project Offering, including financial
        settings, planned roles, and associated timesheet project.
      operationId: GetProjectOffering
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: project_id
          in: path
          description: The ID of the Project, to which this Project Offering belongs.
          required: true
          schema:
            type: string
            description: The ID of the Project, to which this Project Offering belongs.
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectOffering'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - ProjectOfferings
      summary: Update Project Offering.
      description: >-
        Updates a Project Offering's name and billing model, if provided. The
        ability to modify a Project Offering is limited, once the parent Project
        status has been moved beyond Awaiting Start.
      operationId: UpdateProjectOffering
      parameters:
        - name: id
          in: path
          description: ID of the Project Offering.
          required: true
          schema:
            type: string
            description: ID of the Project Offering.
            format: uuid
        - name: project_id
          in: path
          description: The ID of the Project, to which this Project Offering belongs.
          required: true
          schema:
            type: string
            description: The ID of the Project, to which this Project Offering belongs.
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateProjectOffering'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateProjectOffering'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{project_id}/offerings/{id}/metrics:
    get:
      tags:
        - ProjectOfferings
      summary: Get Project Offering Metrics
      description: >-
        Labor and financial metrics for this Project Offering. All calculations
        involving Actual Time entries are subject to the Calculation Threshold
        organization setting.
      operationId: GetProjectOfferingMetricsById
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: project_id
          in: path
          description: The ID of the Project, to which this Project Offering belongs.
          required: true
          schema:
            type: string
            description: The ID of the Project, to which this Project Offering belongs.
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectOfferingMetrics'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{project_id}/offerings/{project_offering_id}/roles:
    get:
      tags:
        - ProjectOfferingRoles
      summary: List Project Offering Roles
      description: >-
        Lists paginated project offering roles currently planned or used within
        a project offering.
      operationId: ListProjectOfferingRoles
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: terms
          in: query
          schema:
            type: string
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: project_offering_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectOfferingRoleDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - ProjectOfferingRoles
      summary: Create Project Offering Role
      description: Creates a Project Offering Role.
      operationId: CreateProjectOfferingRole
      parameters:
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: project_offering_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateProjectOfferingRole'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateProjectOfferingRole'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectOfferingRole'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{project_id}/offerings/{project_offering_id}/roles/{id}:
    delete:
      tags:
        - ProjectOfferingRoles
      summary: Delete Project Offering Role
      description: >-
        Deletes a Project Offering Role. The role must not have any assignments
        or planned time.
      operationId: DeleteProjectOfferingRole
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: project_offering_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '204':
          description: No Content
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    get:
      tags:
        - ProjectOfferingRoles
      summary: Get Project Offering Role
      description: >-
        Gets details of a specific role within a Project Offering, including
        assignment.
      operationId: GetProjectOfferingRole
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: project_offering_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectOfferingRole'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - ProjectOfferingRoles
      summary: Update Project Offering Role
      description: >-
        Updates a Project Offering Role. This includes assigning a specific
        `Person` or `Requisition`. Removing or replacing an assignment where the
        current person has actuals will return a 409 Conflict.
      operationId: UpdateProjectOfferingRole
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: project_offering_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateProjectOfferingRole'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateProjectOfferingRole'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{project_id}/offerings/{project_offering_id}/roles/{id}/planned-time:
    get:
      tags:
        - ProjectOfferingRoles
      summary: List Project Offering Role Plans
      description: >-
        Lists paginated planned time entries for a Project Offering Role with
        filtering by date range. Days with no planned hours are not returned.
      operationId: ListProjectOfferingRolePlans
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: start_date
          in: query
          description: >-
            Filter by entries recorded on or after this date. ISO date
            formatting expected (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Filter by entries recorded on or after this date. ISO date
              formatting expected (yyyy-MM-dd)
            format: date
        - name: end_date
          in: query
          description: >-
            Filter by entries recorded on or before this date. ISO date
            formatting expected (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Filter by entries recorded on or before this date. ISO date
              formatting expected (yyyy-MM-dd)
            format: date
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: project_offering_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/ProjectOfferingRolePlannedTimeDtoPagedResultsDto
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - ProjectOfferingRoles
      summary: Update Project Offering Role Plans
      description: >-
        Updates a Project Offering Role's Plans. Takes an array of
        ProjectOfferingRolePlannedTime entries and applies them to the specified
        Project Offering Role. Up to 100 entries can be sent at a time. To clear
        plans for a given day, send 0 hours. Dates omitted from the request will
        not be altered.
      operationId: UpdateProjectOfferingRolePlans
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: project_offering_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/ProjectOfferingRolePlannedTime'
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/ProjectOfferingRolePlannedTime'
      responses:
        '204':
          description: No Content
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/projects/{target_id}/merge/{source_id}:
    post:
      tags:
        - Projects
      summary: Merge Projects
      description: >-
        Merges a source project into a target project, consolidating all project
        offerings, roles, and associated data from the source into the target.
        This operation cannot be undone. Projects with actual time on them
        cannot be the source of a merge.
      operationId: MergeProjects
      parameters:
        - name: target_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: source_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '204':
          description: No Content
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/rate-cards:
    get:
      tags:
        - RateCards
      summary: List Rate Cards
      description: Returns a paginated list of Rate Cards.
      operationId: ListRateCards
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateCardDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/rate-cards/{rate_card_id}/rates:
    get:
      tags:
        - RateCardRates
      summary: List Rate Card Rates
      description: Gets a paginated list of rates for all roles on a specific rate card.
      operationId: ListRateCardRates
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: rate_card_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateCardRateDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/roles:
    get:
      tags:
        - Roles
      summary: List Roles
      description: >-
        Returns paginated list of defined roles used in shaping resource plans,
        typically categorized by department and used to match people to work.
      operationId: ListRoles
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: archived
          in: query
          description: Indicates if results should be filtered by their archived status.
          schema:
            type: boolean
            description: Indicates if results should be filtered by their archived status.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoleDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    post:
      tags:
        - Roles
      summary: Create Role
      description: >-
        Creates a new role within a department to be used for shaping, planning,
        and reporting.
      operationId: CreateRole
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateRole'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CreateRole'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Role'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/roles/{id}:
    get:
      tags:
        - Roles
      summary: Get Role
      description: >-
        Gets details of a specific role used for shaping, planning, and
        reporting.
      operationId: GetRole
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Role'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
    patch:
      tags:
        - Roles
      summary: Update Role
      description: >-
        Updates an existing role's properties including name, department,
        capacity, and utilization targets.
      operationId: UpdateRole
      parameters:
        - name: id
          in: path
          description: ID of the resource
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json-patch+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateRole'
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/UpdateRole'
      responses:
        '200':
          description: OK
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/tags:
    get:
      tags:
        - Tags
      summary: List all Tags
      description: >-
        Returns all custom tags used throughout the system for categorization,
        filtering, and segmentation of people, projects, or clients.
      operationId: ListTags
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TagList'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
  /v1/timesheet-entries:
    get:
      tags:
        - TimesheetEntries
      summary: List Timesheet Entries
      description: >-
        Gets a paginated list of timesheet entries recorded for a given time
        period with optional filtering by project offering, approval status, and
        etc. When no start or end date filters are provided, returns entries
        from the last 7 days (7 days ago through today).
      operationId: ListTimesheetEntries
      parameters:
        - name: page
          in: query
          description: The specific page of results requested.
          schema:
            type: integer
            description: The specific page of results requested.
            format: int32
        - name: page_size
          in: query
          description: The number of results in each page.
          schema:
            type: integer
            description: The number of results in each page.
            format: int32
        - name: start_date
          in: query
          description: >-
            Filter by entries recorded on or after this date. When not provided,
            defaults to 7 days ago from today. Currently, this endpoint requires
            the queried date range to not exceed 31 days. You must specify an
            end date filter when specifying this value. ISO date formatting
            expected (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Filter by entries recorded on or after this date. When not
              provided, defaults to 7 days ago from today. Currently, this
              endpoint requires the queried date range to not exceed 31 days.
              You must specify an end date filter when specifying this value.
              ISO date formatting expected (yyyy-MM-dd)
            format: date
        - name: end_date
          in: query
          description: >-
            Filter by entries recorded on or before this date. When not
            provided, defaults to today. You must specify an start date filter
            when specifying this value. ISO date formatting expected
            (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Filter by entries recorded on or before this date. When not
              provided, defaults to today. You must specify an start date filter
              when specifying this value. ISO date formatting expected
              (yyyy-MM-dd)
            format: date
        - name: approval_status
          in: query
          schema:
            allOf:
              - $ref: '#/components/schemas/TimesheetSubmissionState'
        - name: approval_status_start_date
          in: query
          description: >-
            Optional filter for entries with an approval status change on or
            after this date. Currently, this endpoint requires the queried date
            range to not exceed 31 days. You must specify an approval status end
            date filter when specifying this value. ISO date formatting expected
            (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Optional filter for entries with an approval status change on or
              after this date. Currently, this endpoint requires the queried
              date range to not exceed 31 days. You must specify an approval
              status end date filter when specifying this value. ISO date
              formatting expected (yyyy-MM-dd)
            format: date
        - name: approval_status_end_date
          in: query
          description: >-
            Optional filter for entries with an approval status change on or
            before this date. You must specify an approval status start date
            filter when specifying this value. ISO date formatting expected
            (yyyy-MM-dd)
          schema:
            type: string
            description: >-
              Optional filter for entries with an approval status change on or
              before this date. You must specify an approval status start date
              filter when specifying this value. ISO date formatting expected
              (yyyy-MM-dd)
            format: date
        - name: project_id
          in: query
          description: The id of the project in which the time entry belongs to.
          schema:
            type: string
            description: The id of the project in which the time entry belongs to.
            format: uuid
        - name: project_offering_id
          in: query
          description: The id of the project offering in which the time entry belongs to.
          schema:
            type: string
            description: The id of the project offering in which the time entry belongs to.
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimesheetEntryDtoPagedResultsDto'
        '400':
          description: The request contains validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
components:
  schemas:
    ActualTime:
      type: object
      properties:
        id:
          type: string
          description: The id of the actual time entry
          format: uuid
        project_id:
          type: string
          description: The id of the project that the actual time is being recorded for.
          format: uuid
        project_offering_id:
          type: string
          description: >-
            The id of the project offering in which the actual time entry
            belongs to.
          format: uuid
        project_offering_role_id:
          type: string
          description: >-
            The id of the project offering role that the actual time is recorded
            to.
          format: uuid
        person_id:
          type: string
          description: >-
            The id of the Person to which the actual time entry belongs. If a
            person is specified who does not currently have a role on the
            project, a new `ProjectOfferingRole` will be created using the
            person's default organization role. The person will be assigned to
            it, and the ActualTime entry will be attached.
          format: uuid
        description:
          type: string
          description: Notes associated with the actual time entry.
          nullable: true
        recorded_date:
          type: string
          description: >-
            The date in which the actual time entry is recorded to, in the
            YYYY-MM-DD format.
          format: date
        hours:
          type: number
          description: The number of hours associated with the actual time entry.
          format: double
        billable:
          type: boolean
          description: Indicates whether the actual time entry was for billable work.
      additionalProperties: false
    ActualTimeDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/ActualTime'
          description: The array of result objects for the current page.
      additionalProperties: false
    Assignment:
      required:
        - id
        - type
      type: object
      properties:
        id:
          type: string
          description: >-
            The unique identifier of the resource assigned to the project
            offering role.
          format: uuid
        type:
          title: AssignmentType
          type: object
          allOf:
            - $ref: '#/components/schemas/AssignmentType'
          description: >-
            The type of the resource assigned to the project offering role. This
            describes which entity type is being referred to by `id`.
          x-schema-name: AssignmentType
      additionalProperties: false
    AssignmentType:
      enum:
        - person
        - requisition
      type: string
    BillingModel:
      enum:
        - fixed_bid
        - time_materials
        - retainer
        - non_billable
        - investment
        - admin
      type: string
    BillingModelOptionsBase:
      required:
        - billing_model
      type: object
      properties:
        billing_model:
          title: BillingModel
          type: object
          allOf:
            - $ref: '#/components/schemas/BillingModel'
          description: >-
            The Billing Model of the Project Offering Configuration.  This needs
            to match the Billing Model in the parent request body.
          x-schema-name: BillingModel
      additionalProperties: false
    BillingModelOptionsFixedBid:
      required:
        - service_fee
      type: object
      allOf:
        - $ref: '#/components/schemas/BillingModelOptionsBase'
      properties:
        service_fee:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: The total service fees for the fixed bid Project Offering.
          x-schema-name: Money
      additionalProperties: false
    BillingModelOptionsRetainer:
      required:
        - fee_schedule
      type: object
      allOf:
        - $ref: '#/components/schemas/BillingModelOptionsBase'
      properties:
        fee_schedule:
          type: array
          items:
            $ref: '#/components/schemas/FeeSchedule'
          description: >-
            The fee schedule for the fixed retainer Project Offering. There can
            only be one fee item per calendar date. When updating the fee
            schedule of a Project Offering, all existing fee schedule items will
            be removed and replaced with the provided list.
          nullable: true
      additionalProperties: false
    BillingModelOptionsTimeMaterials:
      required:
        - rate_card_id
      type: object
      allOf:
        - $ref: '#/components/schemas/BillingModelOptionsBase'
      properties:
        rate_card_id:
          type: string
          description: >-
            The ID for the Rate Card that should be associated with this Time
            and Materials Project Offering.
          format: uuid
      additionalProperties: false
    Client:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier of the client in Parallax.
          format: uuid
        name:
          type: string
          description: >-
            The name of the client organization associated with one or more
            projects.
        archived:
          type: boolean
          description: >-
            Indicates whether the client record has been archived and is no
            longer active for project assignment.
        created_date:
          type: string
          description: >-
            The date and time when the client record was initially created in
            Parallax.
          format: date-time
        modified_date:
          type: string
          description: >-
            The date and time when the client record was last modified in
            Parallax.
          format: date-time
      additionalProperties: false
    ClientDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/Client'
          description: The array of result objects for the current page.
      additionalProperties: false
    CostMetrics:
      required:
        - actual_costs
        - estimated_at_completion_costs
        - estimated_to_completion_costs
        - sold_costs
      type: object
      properties:
        sold_costs:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The total cost associated to the offering at the time the sold
            snapshot was generated.
          x-schema-name: Money
        actual_costs:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The actual costs associated to the offering at the time the metrics
            were generated.
          x-schema-name: Money
        estimated_at_completion_costs:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: The total cost estimated at the time of offering completion.
          x-schema-name: Money
        estimated_to_completion_costs:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The total cost estimated remaining to the time of offering
            completion.
          x-schema-name: Money
      additionalProperties: false
    CreateActualTime:
      required:
        - billable
        - hours
        - person_id
        - project_id
        - project_offering_id
        - recorded_date
      type: object
      properties:
        project_id:
          type: string
          description: The id of the project that the actual time is being recorded for.
          format: uuid
        project_offering_id:
          type: string
          description: >-
            The id of the project offering in which the actual time entry
            belongs to.
          format: uuid
        person_id:
          type: string
          description: >-
            The id of the Person to which the actual time entry belongs. If a
            person is specified who does not currently have a role on the
            project, a new `ProjectOfferingRole` will be created using the
            person's default organization role. The person will be assigned to
            it, and the ActualTime entry will be attached.
          format: uuid
        description:
          type: string
          description: Notes associated with the actual time entry.
          nullable: true
        recorded_date:
          type: string
          description: >-
            The date in which the actual time entry is recorded to, in the
            YYYY-MM-DD format.
          format: date
        hours:
          type: number
          description: The number of hours associated with the actual time entry.
          format: double
        billable:
          type: boolean
          description: Indicates whether the actual time entry was for billable work.
      additionalProperties: false
    CreateClient:
      required:
        - name
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the client organization associated with one or more
            projects.
      additionalProperties: false
    CreateDepartment:
      required:
        - name
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the department used to categorize employees into
            functional teams for capacity planning.
      additionalProperties: false
    CreatePerson:
      required:
        - email_address
      type: object
      properties:
        given_name:
          type: string
          description: The first name or given name of the Person.
          nullable: true
        family_name:
          type: string
          description: The last name or family name of the Person.
          nullable: true
        email_address:
          minLength: 1
          type: string
          description: The email address associated with the Person.
        capacity:
          type: number
          description: >-
            The capacity of this Person if they are using a custom capacity
            instead of their Role's capacity.Note: This value can be cleared out
            by sending `null` in the request body.
          format: double
          nullable: true
        role_id:
          type: string
          description: >-
            Id of the Role to be used as the primary (default) Role for this
            person. If `null`, the unassigned role will be applied instead.
          format: uuid
          nullable: true
        billable_utilization_target:
          type: number
          description: >-
            The billable utilization target of this Person if they are using a
            custom target utilization instead of their Role's target
            utilization. Note: This value can be cleared out by sending `null`
            in the request body.
          format: double
          nullable: true
        billable:
          type: boolean
          description: >-
            Denotes whether this Person's time worked is billable. Defaults to
            `true` for new records.
        start_date:
          type: string
          description: >-
            The earliest date this Person is available for resourcing on a
            Project. The Person's capacity prior to this date is 0%.
          format: date
          nullable: true
        end_date:
          type: string
          description: >-
            If this Person will have or has had their employment or contract
            terminated, this is the last date they are available for resourcing
            on a project. They will automatically be archived after this date
            has passed, and their capacity will drop to 0%. This value can be
            cleared out by sending `null` in the request body.
          format: date
          nullable: true
        worker_type:
          title: WorkerType
          type: object
          allOf:
            - $ref: '#/components/schemas/WorkerType'
          description: >-
            Denotes whether this Person is a full time employee, contractor,
            etc. Defaults to `full_time` for new records.
          x-schema-name: WorkerType
        tags:
          type: array
          items:
            type: string
          description: >-
            A list of tags used to categorize the Person for filtering,
            reporting, or custom grouping.
          nullable: true
        image_url:
          type: string
          description: A publicly-accessible URL to an avatar for this Person.
          nullable: true
      additionalProperties: false
    CreatePipeline:
      required:
        - name
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the Pipeline, typically reflecting the sales funnel or
            opportunity workflow.
        is_enabled:
          type: boolean
          description: >-
            Indicates whether syncs for this Pipeline are enabled; differs from
            IsArchived.
          default: true
      additionalProperties: false
    CreateProject:
      required:
        - client_id
        - name
        - start_date
        - target_budget
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the Project, typically describing the work engagement or
            scope for the Client.
        start_date:
          type: string
          description: The scheduled start date for the Project’s resource plan.
          format: date
        end_date:
          type: string
          description: The scheduled end date for the Project’s resource plan.
          format: date
          nullable: true
        client_id:
          type: string
          description: Id of the Client associated with this Project.
          format: uuid
        target_budget:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The target budget for the Project, representing the expected revenue
            from the Client.
          x-schema-name: Money
        target_margin:
          type: number
          description: >-
            Target margin for the Project. Defaults to Organization's target
            margin.
          format: double
          nullable: true
        tags:
          type: array
          items:
            type: string
          description: >-
            A list of tags assigned to the Project for filtering,
            categorization, or reporting.
        project_model:
          title: ProjectModel
          type: object
          allOf:
            - $ref: '#/components/schemas/ProjectModel'
          description: Project model. Default is client.
          x-schema-name: ProjectModel
        currency_code:
          type: string
          description: >-
            Currency code for the Project. Defaults to Organization's currency
            code.
          nullable: true
        status:
          title: ProjectStatus
          type: object
          allOf:
            - $ref: '#/components/schemas/ProjectStatus'
          description: Initial status for the Project. Default is pre_sale.
          nullable: true
          x-schema-name: ProjectStatus
        stage_id:
          type: string
          description: The CRM Pipeline Stage id this Project is linked to.
          format: uuid
          nullable: true
      additionalProperties: false
    CreateProjectOffering:
      required:
        - billing_model
        - name
      type: object
      properties:
        name:
          type: string
          description: The name for the Project Offering.
        billing_model:
          title: BillingModel
          type: object
          allOf:
            - $ref: '#/components/schemas/BillingModel'
          description: The Billing Model for the Project Offering.
          x-schema-name: BillingModel
        billing_model_options:
          type: object
          oneOf:
            - $ref: '#/components/schemas/BillingModelOptionsFixedBid'
            - $ref: '#/components/schemas/BillingModelOptionsRetainer'
            - $ref: '#/components/schemas/BillingModelOptionsTimeMaterials'
          description: Additional Billing Model configuration for the Project Offering.
          nullable: true
      additionalProperties: false
    CreateProjectOfferingRole:
      required:
        - role_id
      type: object
      properties:
        role_id:
          type: string
          description: Id of the Role that will be performing work on this ProjectOffering.
          format: uuid
        assignment:
          title: Assignment
          type: object
          allOf:
            - $ref: '#/components/schemas/Assignment'
          description: Optional assignment of a Person or Requisition to this role.
          nullable: true
          x-schema-name: Assignment
        tags:
          type: array
          items:
            type: string
          description: >-
            Optional list of tags to associate with this Project Offering Role.
            Tags help categorize and filter roles.
          nullable: true
      additionalProperties: false
    CreateRole:
      required:
        - department_id
        - name
      type: object
      properties:
        department_id:
          type: string
          description: >-
            The unique identifier of the Department that this Role belongs to
            for capacity and reporting segmentation.
          format: uuid
        name:
          type: string
          description: >-
            The name of the Role, typically describing the job function or skill
            set (e.g. Designer, Developer).
      additionalProperties: false
    CreateStage:
      required:
        - confidence
        - name
      type: object
      properties:
        name:
          type: string
        confidence:
          type: number
          format: double
      additionalProperties: false
    Department:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier of the department in Parallax.
          format: uuid
        name:
          type: string
          description: >-
            The name of the department used to categorize employees into
            functional teams for capacity planning.
        archived:
          type: boolean
          description: >-
            Indicates whether the department is archived and no longer active
            for resource assignment or reporting.
      additionalProperties: false
    DepartmentDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/Department'
          description: The array of result objects for the current page.
      additionalProperties: false
    FeeSchedule:
      required:
        - fee_amount
        - occured_on
      type: object
      properties:
        occured_on:
          type: string
          description: The amount of the service fee.
          format: date
        fee_amount:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The date in which the service fee was invoiced, received or
            otherwise recognized in ISO format.
          x-schema-name: Money
      additionalProperties: false
    HoursMetrics:
      required:
        - actual_hours
        - estimated_at_completion_hours
        - estimated_to_completion_hours
        - sold_hours
      type: object
      properties:
        sold_hours:
          type: number
          description: >-
            The total revenue associated to the offering at the time the sold
            snapshot was generated.
          format: double
        actual_hours:
          type: number
          description: >-
            The actual revenue associated to the offering at the time the
            metrics were generated.
          format: double
        estimated_at_completion_hours:
          type: number
          description: The total revenue estimated at the time of offering completion.
          format: double
        estimated_to_completion_hours:
          type: number
          description: >-
            The total revenue estimated remaining to the time of offering
            completion.
          format: double
      additionalProperties: false
    Money:
      type: object
      properties:
        currency_code:
          type: string
          description: The currency code of the monetary object.
        amount:
          type: number
          description: The amount of the monetary object.
          format: double
          default: 0
      additionalProperties: false
    Person:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier of the Person in Parallax.
          format: uuid
        given_name:
          type: string
          description: The first name or given name of the Person.
          nullable: true
        family_name:
          type: string
          description: The last name or family name of the Person.
          nullable: true
        email_address:
          type: string
          description: The email address associated with the Person.
          nullable: true
        capacity:
          type: number
          description: >-
            The capacity of this Person if they are using a custom capacity
            instead of their Role's capacity.Note: This value can be cleared out
            by sending `null` in the request body.
          format: double
          nullable: true
        role_id:
          type: string
          description: >-
            Id of the Role to be used as the primary (default) Role for this
            person.
          format: uuid
        billable_utilization_target:
          type: number
          description: >-
            The billable utilization target of this Person if they are using a
            custom target utilization instead of their Role's target
            utilization. Note: This value can be cleared out by sending `null`
            in the request body.
          format: double
          nullable: true
        billable:
          type: boolean
          description: >-
            Indicates whether the Person's work is considered billable for
            client projects.
        start_date:
          type: string
          description: >-
            The earliest date this Person is available for resourcing on a
            Project. The Person's capacity prior to this date is 0%.
          format: date
          nullable: true
        end_date:
          type: string
          description: >-
            If this Person will have or has had their employment or contract
            terminated, this is the last date they are available for resourcing
            on a project. They will automatically be archived after this date
            has passed, and their capacity will drop to 0%. This value can be
            cleared out by sending `null` in the request body.
          format: date
          nullable: true
        worker_type:
          title: WorkerType
          type: object
          allOf:
            - $ref: '#/components/schemas/WorkerType'
          description: >-
            Specifies the worker classification for the Person, such as Employee
            or Contractor.
          x-schema-name: WorkerType
        tags:
          type: array
          items:
            type: string
          description: >-
            A list of tags used to categorize the Person for filtering,
            reporting, or custom grouping.
        created_date:
          type: string
          description: The date and time when the Person record was created in Parallax.
          format: date-time
        modified_date:
          type: string
          description: >-
            The date and time when the Person record was last modified in
            Parallax.
          format: date-time
        image_url:
          type: string
          description: The URL of the profile image associated with the Person.
          nullable: true
        archived:
          type: boolean
          description: >-
            Indicates whether the Person is archived and no longer active for
            project assignment or planning.
        current_cost_rate:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The current effective cost rate for the person. This will return the
            current overridden cost rate of the person, and will fall back to
            the current cost rate of their assigned role if there is no
            override.
          x-schema-name: Money
      additionalProperties: false
    PersonDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/Person'
          description: The array of result objects for the current page.
      additionalProperties: false
    Pipeline:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier of the Pipeline in Parallax.
          format: uuid
        name:
          type: string
          description: >-
            The name of the Pipeline, typically reflecting the sales funnel or
            opportunity workflow.
        currency_code:
          type: string
          description: >-
            The ISO currency code associated with the Pipeline, used for
            financial values tied to deals.
        is_enabled:
          type: boolean
          description: >-
            Indicates whether syncs for this Pipeline are enabled; differs from
            IsArchived.
        archived:
          type: boolean
          description: >-
            Indicates whether the Pipeline is archived and no longer active in
            Parallax.
      additionalProperties: false
    PipelineDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/Pipeline'
          description: The array of result objects for the current page.
      additionalProperties: false
    Project:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier for the Project in Parallax.
          format: uuid
        name:
          type: string
          description: >-
            The name of the Project, typically describing the work engagement or
            scope for the Client.
        client_id:
          type: string
          description: Id of the Client associated with this Project.
          format: uuid
          nullable: true
        stage_id:
          type: string
          description: Id of the Project's current Pipeline Stage.
          format: uuid
          nullable: true
        start_date:
          type: string
          description: The scheduled start date for the Project’s resource plan.
          format: date
        end_date:
          type: string
          description: The scheduled end date for the Project’s resource plan.
          format: date
        target_budget:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The target budget for the Project, representing the expected revenue
            from the Client.
          x-schema-name: Money
        target_margin:
          type: number
          description: >-
            Target margin for the Project. Defaults to Organization's target
            margin.
          format: double
        currency_code:
          type: string
          description: >-
            Currency code for the Project. Defaults to Organization's currency
            code.
        status:
          title: ProjectStatus
          type: object
          allOf:
            - $ref: '#/components/schemas/ProjectStatus'
          description: Initial status for the Project. Default is pre_sale.
          x-schema-name: ProjectStatus
        project_model:
          title: ProjectModel
          type: object
          allOf:
            - $ref: '#/components/schemas/ProjectModel'
          description: Project model. Default is client.
          x-schema-name: ProjectModel
        archived:
          type: boolean
          description: >-
            Indicates whether the Project is archived and no longer active for
            delivery or planning.
        is_included:
          type: boolean
          description: >-
            Manual flag to hide Projects from reports while keeping them visible
            in the UI.
        tags:
          type: array
          items:
            type: string
          description: >-
            A list of tags assigned to the Project for filtering,
            categorization, or reporting.
        created_date:
          type: string
          description: The date and time when the Project record was created in Parallax.
          format: date-time
        modified_date:
          type: string
          description: >-
            The date and time when the Project record was last modified in
            Parallax.
          format: date-time
        external_ids:
          type: array
          items:
            type: string
          description: >-
            All external IDs that are associated with the Project. These are
            returned in a delimited format along with the provider. For example,
            a Hubspot ID would be formatted like so: 'px_hubspot:12345678901
      additionalProperties: false
    ProjectDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/Project'
          description: The array of result objects for the current page.
      additionalProperties: false
    ProjectModel:
      enum:
        - client
        - internal
      type: string
    ProjectOffering:
      required:
        - billing_model
        - billing_model_options
        - id
        - name
      type: object
      properties:
        id:
          type: string
          description: The unique identifier for the Project Offering.
          format: uuid
        name:
          type: string
          description: The name of the Project Offering.
        billing_model:
          title: BillingModel
          type: object
          allOf:
            - $ref: '#/components/schemas/BillingModel'
          description: >-
            The billing model applied to the Project Offering.  This is
            restricted by the Project's Project Type. Client projects support
            Time & Materials, Fixed Bid, and Fixed Retainer billing models while
            Internal projects only allow Investment and Admin models
          x-schema-name: BillingModel
        billing_model_options:
          oneOf:
            - $ref: '#/components/schemas/BillingModelOptionsFixedBid'
            - $ref: '#/components/schemas/BillingModelOptionsRetainer'
            - $ref: '#/components/schemas/BillingModelOptionsTimeMaterials'
          description: Additional Billing Model configuration for the Project Offering.
      additionalProperties: false
    ProjectOfferingDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/ProjectOffering'
          description: The array of result objects for the current page.
      additionalProperties: false
    ProjectOfferingMetrics:
      required:
        - cost_metrics
        - hours_metrics
        - revenue_metrics
      type: object
      properties:
        id:
          type: string
          description: The unique identifier for the Project Offering.
          format: uuid
        calculated_date:
          type: string
          description: The date in which the metrics were calculated.
          format: date-time
        cost_metrics:
          title: CostMetrics
          type: object
          allOf:
            - $ref: '#/components/schemas/CostMetrics'
          description: The cost metrics of the project offering.
          x-schema-name: CostMetrics
        revenue_metrics:
          title: RevenueMetrics
          type: object
          allOf:
            - $ref: '#/components/schemas/RevenueMetrics'
          description: The revenue metrics of the project offering.
          x-schema-name: RevenueMetrics
        hours_metrics:
          title: HoursMetrics
          type: object
          allOf:
            - $ref: '#/components/schemas/HoursMetrics'
          description: The hour metrics of the project offering.
          x-schema-name: HoursMetrics
      additionalProperties: false
    ProjectOfferingRole:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier for the project offering role.
          format: uuid
        assignment:
          title: Assignment
          type: object
          allOf:
            - $ref: '#/components/schemas/Assignment'
          description: >-
            The unique identifier for the (optional) person attached to the
            role.
          nullable: true
          x-schema-name: Assignment
        role_id:
          type: string
          description: >-
            The unique identifier for role that describes the project offering
            role.
          format: uuid
        tags:
          type: array
          items:
            type: string
          description: >-
            A list of tags assigned to the Project Offering Role for filtering,
            categorization, or reporting.
      additionalProperties: false
    ProjectOfferingRoleDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/ProjectOfferingRole'
          description: The array of result objects for the current page.
      additionalProperties: false
    ProjectOfferingRolePlannedTime:
      required:
        - hours
        - plan_date
      type: object
      properties:
        plan_date:
          type: string
          description: >-
            The date in which the actual time entry is recorded to, in the
            YYYY-MM-DD format.
          format: date
        hours:
          type: number
          description: The number of hours associated with the planned time entry.
          format: double
      additionalProperties: false
    ProjectOfferingRolePlannedTimeDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/ProjectOfferingRolePlannedTime'
          description: The array of result objects for the current page.
      additionalProperties: false
    ProjectStatus:
      enum:
        - pre_sale
        - awaiting_start
        - completed
        - in_progress
        - on_hold
      type: string
    RateCard:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier of the Rate Card in Parallax.
          format: uuid
        name:
          type: string
          description: The name of the Rate Card.
        default_rate:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: The default rate for roles that are not included in the Rate Card.
          x-schema-name: Money
        archived:
          type: boolean
          description: Indicates whether the Rate Card is archived or not.
      additionalProperties: false
    RateCardDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/RateCard'
          description: The array of result objects for the current page.
      additionalProperties: false
    RateCardRate:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier for the rate card role rate in Parallax.
          format: uuid
        role_id:
          type: string
          description: >-
            The unique identifier of the role that this rate applies to. This
            links to the Parallax Role this rate applies to.
          format: uuid
        rate:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: The bill rate for this role on the rate card.
          x-schema-name: Money
      additionalProperties: false
    RateCardRateDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/RateCardRate'
          description: The array of result objects for the current page.
      additionalProperties: false
    RevenueMetrics:
      required:
        - actual_revenue
        - estimated_at_completion_revenue
        - estimated_to_completion_revenue
        - sold_revenue
      type: object
      properties:
        sold_revenue:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The total revenue associated to the offering at the time the sold
            snapshot was generated.
          x-schema-name: Money
        actual_revenue:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The actual revenue associated to the offering at the time the
            metrics were generated.
          x-schema-name: Money
        estimated_at_completion_revenue:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: The total revenue estimated at the time of offering completion.
          x-schema-name: Money
        estimated_to_completion_revenue:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The total revenue estimated remaining to the time of offering
            completion.
          x-schema-name: Money
      additionalProperties: false
    Role:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier for the Role in Parallax.
          format: uuid
        name:
          type: string
          description: >-
            The name of the Role, typically describing the job function or skill
            set (e.g. Designer, Developer).
        department_id:
          type: string
          description: >-
            The unique identifier of the Department that this Role belongs to
            for capacity and reporting segmentation.
          format: uuid
        capacity:
          type: number
          description: >-
            The full-time capacity for this Role, expressed as a percentage
            (e.g. 1.0 = 100%).
          format: double
        billable_utilization_target:
          type: number
          description: >-
            The target percentage of billable utilization expected for this
            Role, expressed as a percentage (e.g. 1.0 = 100%).
          format: double
        archived:
          type: boolean
          description: >-
            Indicates whether this Role has been archived and is no longer
            active for planning or reporting.
        created_date:
          type: string
          description: The date and time when the Role record was created in Parallax.
          format: date-time
        modified_date:
          type: string
          description: >-
            The date and time when the Role record was last modified in
            Parallax.
          format: date-time
      additionalProperties: false
    RoleDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/Role'
          description: The array of result objects for the current page.
      additionalProperties: false
    Stage:
      type: object
      properties:
        id:
          type: string
          description: The unique identifier for the Pipeline Stage in Parallax.
          format: uuid
        pipeline_id:
          type: string
          description: The unique identifier of the Pipeline that this Stage belongs to.
          format: uuid
        name:
          type: string
          description: The name of the Pipeline Stage.
        confidence:
          type: number
          description: >-
            Represents the likelihood that the project will be sold, as a value
            between 0.0 (no confidence) and 1.0 (full confidence).
          format: double
        archived:
          type: boolean
          description: >-
            Indicates whether this Pipeline Stage has been archived and is no
            longer active.
        created_date:
          type: string
          description: >-
            The date and time when the Pipeline Stage record was created in
            Parallax.
          format: date-time
        modified_date:
          type: string
          description: >-
            The date and time when the Pipeline Stage record was last modified
            in Parallax.
          format: date-time
      additionalProperties: false
    StageDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/Stage'
          description: The array of result objects for the current page.
      additionalProperties: false
    TagList:
      type: object
      properties:
        tags:
          type: array
          items:
            type: string
          description: |-
            List of tags.

             Tag names are structured as `CATEGORY::TAG_NAME`, with a `::` separating the category and tag name. Category names will be returned with `::` in their name. 

             **Example**: `Skills::` would indicate a category named skills. Further, `Skills::ActionScript` would indicate a tag named `ActionScript` within the `Skills` category.
      additionalProperties: false
    TimesheetEntry:
      type: object
      properties:
        id:
          type: string
          description: The id of the time entry.
          format: uuid
        submission_id:
          type: string
          description: The id of the submission in which the time entry belongs to.
          format: uuid
        submission_start_date:
          type: string
          description: >-
            The start date of the submission (period) this time entry belongs
            to.
        submission_end_date:
          type: string
          description: The end date of the submission (period) this time entry belongs to.
        approval_status:
          title: TimesheetSubmissionState
          type: object
          allOf:
            - $ref: '#/components/schemas/TimesheetSubmissionState'
          x-schema-name: TimesheetSubmissionState
        approval_status_date:
          type: string
          description: >-
            The date and time at which the timesheet's approval status changed
            to its current value.
        person_id:
          type: string
          description: The id of the Person in which the actual time entry belongs to.
          format: uuid
        client_id:
          type: string
          description: The unique identifier of the client in Parallax.
          format: uuid
          nullable: true
        project_id:
          type: string
          description: The id of the project in which the time entry belongs to.
          format: uuid
        project_offering_id:
          type: string
          description: The id of the project offering in which the time entry belongs to.
          format: uuid
        project_offering_role_id:
          type: string
          description: >-
            The id of the project offering role that the actual time is recorded
            to.
          format: uuid
        note:
          type: string
          description: Notes associated with the time entry.
          nullable: true
        date:
          type: string
          description: >-
            The date in which the time entry is recorded to, in the YYYY-MM-DD
            format.
        hours:
          type: number
          description: The number of hours associated with the time entry.
          format: double
        is_billable:
          type: boolean
          description: Indicates whether the time entry was for billable work.
      additionalProperties: false
    TimesheetEntryDtoPagedResultsDto:
      required:
        - results
      type: object
      properties:
        count:
          type: integer
          description: The number of results in the current page.
          format: int64
        total:
          type: integer
          description: The total number of results that fulfill the request.
          format: int64
        page:
          type: integer
          description: The current page of results being returned.
          format: int64
        total_pages:
          type: integer
          description: The total number of available pages that fulfill the request.
          format: int64
        page_size:
          type: integer
          description: The number of results in each page returned.
          format: int64
        results:
          type: array
          items:
            $ref: '#/components/schemas/TimesheetEntry'
          description: The array of result objects for the current page.
      additionalProperties: false
    TimesheetSubmissionState:
      enum:
        - open
        - submitted
        - approved
      type: string
    UpdateActualTime:
      type: object
      properties:
        project_offering_id:
          type: string
          description: >-
            The id of the project offering in which the actual time entry
            belongs to.
          format: uuid
          nullable: true
        person_id:
          type: string
          description: >-
            The id of the Person to which the actual time entry belongs. If a
            person is specified who does not currently have a role on the
            project, a new `ProjectOfferingRole` will be created using the
            person's default organization role. The person will be assigned to
            it, and the ActualTime entry will be attached.
          format: uuid
          nullable: true
        description:
          type: string
          description: Notes associated with the actual time entry.
          nullable: true
        recorded_date:
          type: string
          description: >-
            The date in which the actual time entry is recorded to, in the
            YYYY-MM-DD format.
          format: date
          nullable: true
        hours:
          type: number
          description: The number of hours associated with the actual time entry.
          format: double
          nullable: true
        billable:
          type: boolean
          description: Indicates whether the actual time entry was for billable work.
          nullable: true
      additionalProperties: false
    UpdateClient:
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the client organization associated with one or more
            projects.
          nullable: true
        archived:
          type: boolean
          description: >-
            Indicates whether the client record has been archived and is no
            longer active for project assignment.
          nullable: true
      additionalProperties: false
    UpdateDepartment:
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the department used to categorize employees into
            functional teams for capacity planning.
          nullable: true
        archived:
          type: boolean
          description: >-
            Indicates whether the department is archived and no longer active
            for resource assignment or reporting.
          nullable: true
      additionalProperties: false
    UpdatePerson:
      type: object
      properties:
        given_name:
          type: string
          description: The first name or given name of the Person.
          nullable: true
        family_name:
          type: string
          description: The last name or family name of the Person.
          nullable: true
        email_address:
          type: string
          description: The email address associated with the Person.
          nullable: true
        capacity:
          type: number
          description: >-
            The capacity of this Person if they are using a custom capacity
            instead of their Role's capacity.Note: This value can be cleared out
            by sending `null` in the request body.
          format: double
          nullable: true
        billable_utilization_target:
          type: number
          description: >-
            The billable utilization target of this Person if they are using a
            custom target utilization instead of their Role's target
            utilization. Note: This value can be cleared out by sending `null`
            in the request body.
          format: double
          nullable: true
        billable:
          type: boolean
          description: >-
            Denotes whether this Person's time worked is billable. Defaults to
            `true` for new records.
          nullable: true
        start_date:
          type: string
          description: >-
            The earliest date this Person is available for resourcing on a
            Project. The Person's capacity prior to this date is 0%.
          format: date
          nullable: true
        end_date:
          type: string
          description: >-
            If this Person will have or has had their employment or contract
            terminated, this is the last date they are available for resourcing
            on a project. They will automatically be archived after this date
            has passed, and their capacity will drop to 0%. This value can be
            cleared out by sending `null` in the request body.
          format: date
          nullable: true
        worker_type:
          title: WorkerType
          type: object
          allOf:
            - $ref: '#/components/schemas/WorkerType'
          description: >-
            Denotes whether this Person is a full time employee, contractor,
            etc. Defaults to `full_time` for new records.
          nullable: true
          x-schema-name: WorkerType
        tags:
          type: array
          items:
            type: string
          description: >-
            Specifies the worker classification for the Person, such as Employee
            or Contractor.
          nullable: true
        image_url:
          type: string
          description: A publicly-accessible URL to an avatar for this Person.
          nullable: true
        archived:
          type: boolean
          description: >-
            Denotes whether this Person has been archived. This is complimentary
            to an `EndDate` that is today or in the past.
          nullable: true
      additionalProperties: false
    UpdatePipeline:
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the Pipeline, typically reflecting the sales funnel or
            opportunity workflow.
          nullable: true
        is_enabled:
          type: boolean
          description: >-
            Indicates whether syncs for this Pipeline are enabled; differs from
            IsArchived.
          nullable: true
        archived:
          type: boolean
          description: >-
            Indicates whether the Pipeline is archived and no longer active in
            Parallax.
          nullable: true
      additionalProperties: false
    UpdateProject:
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the Project, typically describing the work engagement or
            scope for the Client.
          nullable: true
        status:
          title: ProjectStatus
          type: object
          allOf:
            - $ref: '#/components/schemas/ProjectStatus'
          description: Initial status for the Project. Default is pre_sale.
          nullable: true
          x-schema-name: ProjectStatus
        start_date:
          type: string
          description: The scheduled start date for the Project’s resource plan.
          format: date
          nullable: true
        end_date:
          type: string
          description: The scheduled end date for the Project’s resource plan.
          format: date
          nullable: true
        target_margin:
          type: number
          description: >-
            Target margin for the Project. Defaults to Organization's target
            margin.
          format: double
          nullable: true
        target_budget:
          title: Money
          type: object
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            The target budget for the Project, representing the expected revenue
            from the Client.
          nullable: true
          x-schema-name: Money
        archived:
          type: boolean
          description: >-
            Indicates whether the Project is archived and no longer active for
            delivery or planning.
          nullable: true
        client_id:
          type: string
          description: Id of the Client associated with this Project.
          format: uuid
          nullable: true
        stage_id:
          type: string
          description: Id of the Project's current Pipeline Stage.
          format: uuid
          nullable: true
        tags:
          type: array
          items:
            type: string
          description: >-
            A list of tags assigned to the Project for filtering,
            categorization, or reporting.
          nullable: true
        project_model:
          title: ProjectModel
          type: object
          allOf:
            - $ref: '#/components/schemas/ProjectModel'
          description: Project model. Default is client.
          nullable: true
          x-schema-name: ProjectModel
        is_included:
          type: boolean
          description: >-
            Manual flag to hide Projects from reports while keeping them visible
            in the UI.
          nullable: true
      additionalProperties: false
    UpdateProjectOffering:
      type: object
      properties:
        name:
          type: string
          description: The new name for the Project Offering.
          nullable: true
        billing_model:
          title: BillingModel
          type: object
          allOf:
            - $ref: '#/components/schemas/BillingModel'
          description: >-
            The new Billing Model for the Project Offering. This cannot be
            updated for a project offering that is In Progress
          nullable: true
          x-schema-name: BillingModel
        billing_model_options:
          type: object
          oneOf:
            - $ref: '#/components/schemas/BillingModelOptionsFixedBid'
            - $ref: '#/components/schemas/BillingModelOptionsRetainer'
            - $ref: '#/components/schemas/BillingModelOptionsTimeMaterials'
          description: Additional Billing Model configuration for the Project Offering.
          nullable: true
      additionalProperties: false
    UpdateProjectOfferingRole:
      type: object
      properties:
        role_id:
          type: string
          description: >-
            Id of the organization Role that will be performing work on this
            ProjectOffering.
          format: uuid
          nullable: true
        assignment:
          title: Assignment
          type: object
          allOf:
            - $ref: '#/components/schemas/Assignment'
          description: >-
            Assignment of a Person or Requisition to this role. Set to null to
            unassign. _Note: Removing or replacing an assignment where the
            person has actuals will return a 409 Conflict. The person must first
            be reassigned to another role or have their actuals removed._
          nullable: true
          x-schema-name: Assignment
        should_clear_assignment:
          type: boolean
          readOnly: true
        tags:
          type: array
          items:
            type: string
          description: >-
            List of tags to associate with this Project Offering Role. When
            provided, this completely replaces existing tags. Provide an empty
            array to clear all tags. Omit this property to leave tags unchanged.
          nullable: true
      additionalProperties: false
    UpdateRole:
      type: object
      properties:
        name:
          type: string
          description: >-
            The name of the Role, typically describing the job function or skill
            set (e.g. Designer, Developer).
          nullable: true
        department_id:
          type: string
          description: >-
            The unique identifier of the Department that this Role belongs to
            for capacity and reporting segmentation.
          format: uuid
          nullable: true
        archived:
          type: boolean
          description: >-
            Indicates whether this Role has been archived and is no longer
            active for planning or reporting.
          nullable: true
      additionalProperties: false
    UpdateStage:
      type: object
      properties:
        name:
          type: string
          description: The name of the Pipeline Stage.
          nullable: true
        archived:
          type: boolean
          description: >-
            Indicates whether this Pipeline Stage has been archived and is no
            longer active.
          nullable: true
        confidence:
          type: number
          description: >-
            Represents the likelihood that the project will be sold, as a value
            between 0.0 (no confidence) and 1.0 (full confidence).
          format: double
          nullable: true
      additionalProperties: false
    ValidationErrorResponse:
      type: object
      properties:
        type:
          type: string
          description: RFC reference for the error type
        title:
          type: string
          description: Human-readable summary of the error
        status:
          type: integer
          description: HTTP status code
          format: int32
        errors:
          type: array
          items:
            type: string
          description: Detailed error messages for each validation failure
        trace_id:
          type: string
          description: Trace identifier for debugging
      additionalProperties: false
      description: >-
        Represents the structure of validation error responses returned by the
        API
    WorkerType:
      enum:
        - full_time
        - contractor
      type: string
  securitySchemes:
    ApiKey:
      type: apiKey
      description: >-
        Personal Access Token (PAT) for authentication within the X-API-KEY
        header.
      name: X-API-KEY
      in: header
security:
  - ApiKey: []
tags:
  - name: ActualTime
    description: >-
      Actual Time represents the timesheet data capturing the work performed by
      employees and logged against assigned Project Offerings. Actual Time is
      used to compare planned vs. actual effort, drive utilization reporting,
      support variance analysis, and inform project health and forecasting
      across the platform.
  - name: Clients
    description: >-
      A client represents the customer organization associated with one or more
      projects. Clients serve as the primary entity used to group projects,
      service offerings, and resource plans, allowing for aggregated reporting
      on revenue, margin, utilization, and forecasting. Each project is tied to
      a client, enabling organizations to track work and financial performance
      at both the individual project and client account levels.
  - name: Departments
    description: >-
      A department is used to categorize and group roles within the organization
      based on functional teams or disciplines. Departments help segment
      resource capacity, manage utilization targets, and support filtering
      within reporting and planning workflows. Each role in Parallax belongs to
      a department for organizational clarity and capacity planning.
  - name: People
    description: >-
      People represent the individual resources available for assignment to
      projects. People are assigned roles, billable capacity, and utilization
      targets, and can be categorized by worker type, billing type, and
      department. A Persons record is central to capacity planning, resource
      allocation, forecasting, and reporting across the platform.
  - name: Pipelines
    description: >-
      A Pipeline mirrors the sales opportunity stages configured in the
      integrated CRM system. The Pipeline allows Parallax to track deal
      progression, forecast demand, and convert opportunities into projects once
      deals are closed-won.
  - name: ProjectOfferingRoles
    description: >-
      A Project Offering Role defines the specific role, resource allocation,
      and scheduled hours needed within a Service Offering. These roles form the
      basis of the resource plan by identifying the skill sets, timelines, and
      capacity requirements for successful delivery of the scoped work.
  - name: ProjectOfferings
    description: >-
      A Project Offering (Service Offering) represents a distinct scope or phase
      of work within a Project. Each Project Offering contains resource plans,
      financial models, and revenue data, allowing organizations to model
      different work types and billing structures within a single project.
      Offerings help align sales, delivery, and operations teams around specific
      scopes of work and resourcing needs.
  - name: Projects
    description: >-
      A Project represents a distinct engagement or scope of work that the
      organization is delivering for a Client. Projects serve as containers for
      Service Offerings, resource plans, financial models, and delivery data.
  - name: RateCardRates
    description: >-
      Rate Card Rates represent the billable rates for specific roles within a
      Rate Card.
  - name: RateCards
    description: >-
      A Rate Card represents a list of roles with a standard bill rate for each
      role.
  - name: Roles
    description: >-
      A Role defines the type of work or skill set associated with resource
      assignments across projects and offerings. Roles are used to categorize
      resources, shape staffing needs, and support forecasting by identifying
      which types of personnel are required for each project or service
      offering.
  - name: Stages
    description: >-
      A Pipeline Stage represents a single stage within the Pipeline, mapping
      directly to the stages defined in the system. Pipeline Stages allow for
      real-time visibility into opportunity status and expected resource demand
      throughout the sales process.
  - name: Tags
    description: >-
      A Tag is a flexible metadata label used to categorize and filter entities
      such as People, Projects, and Project Offering Roles. Tags support custom
      grouping, reporting, and segmentation across multiple areas of the
      platform, enabling organizations to adapt Parallax to their internal
      business structures and workflows.
  - name: TimesheetEntries
    description: >-
      Timesheet Entries represent time recorded within the Parallax Timesheets
      service, including additional properties related approval state.
x-tagGroups:
  - name: Endpoints
    tags:
      - ActualTime
      - Clients
      - Departments
      - People
      - Pipelines
      - ProjectOfferingRoles
      - ProjectOfferings
      - Projects
      - RateCardRates
      - RateCards
      - Roles
      - Stages
      - Tags
      - TimesheetEntries
  - name: Schemas
    tags:
      - Schemas
